package com.qyhl.module_activities.utils.view;

import android.content.Context;
import com.google.android.material.appbar.AppBarLayout;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.View;

public class AppBarLayoutOverScrollViewBehavior extends AppBarLayout.Behavior {
    //是否展开
    private boolean isExpanded = false;
    //是否收起
    private boolean isNoExpanded = false;

    public AppBarLayoutOverScrollViewBehavior() {
    }

    public AppBarLayoutOverScrollViewBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 当准备开始嵌套滚动时调用
     *
     * @param coordinatorLayout 父布局CoordinatorLayout
     * @param child             使用此Behavior的AppBarLayout
     * @param target            发起嵌套滚动的目标View(即AppBarLayout下面的ScrollView或RecyclerView)
     * @param dx                用户在水平方向上滑动的像素数
     * @param dy                用户在垂直方向上滑动的像素数
     * @param consumed          输出参数，consumed[0]为水平方向应该消耗的距离，consumed[1]为垂直方向应该消耗的距离
     */
    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        if (dy < 0) {
            //下滑
            if (child.getBottom() > 200) {
                setDown();
            } else {
                clearTag();
            }
        } else {
            //上滑
            setUp();
        }
    }

    /**
     * 当嵌套滚动的子View准备快速滚动时调用
     *
     * @param coordinatorLayout 父布局CoordinatorLayout
     * @param child             使用此Behavior的AppBarLayout
     * @param target            发起嵌套滚动的目标View(即AppBarLayout下面的ScrollView或RecyclerView)
     * @param velocityX         水平方向的速度
     * @param velocityY         垂直方向的速度
     * @return 如果Behavior消耗了快速滚动返回true
     */
    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY) {
        boolean supertag = super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
        if (velocityY < 0 && child.getBottom() > 0) {
            //快速下滑
            setDown();
        } else if (velocityY > 0 && child.getBottom() < child.getHeight()) {
            //快速上滑
            setUp();
        }
        return supertag;
    }

    /**
     * 当停止滚动时调用
     *
     * @param coordinatorLayout 父布局CoordinatorLayout
     * @param abl               使用此Behavior的AppBarLayout
     * @param target            发起嵌套滚动的目标View(即AppBarLayout下面的ScrollView或RecyclerView)
     */
    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout abl, View target) {
        super.onStopNestedScroll(coordinatorLayout, abl, target);
        if (isExpanded && abl.getBottom() < abl.getHeight()) {
            //未完全展开
            abl.setExpanded(true, true);
        }
        if (isNoExpanded && abl.getBottom() > 0) {
            //未完全收起
            abl.setExpanded(false, true);
        }
        clearTag();
    }

    private void setUp() {
        isNoExpanded = true;
        isExpanded = false;
    }

    private void setDown() {
        isExpanded = true;
        isNoExpanded = false;
    }

    private void clearTag() {
        isExpanded = false;
        isNoExpanded = false;
    }
}
